<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>关键问题3</title>
</head>
<body>
  <script>
	/* 
    then返回的是一个新的Promise实例，它的数据、状态由什么决定?
					(1)简单表达: 由then()所指定的回调函数执行的结果决定。
					(2)详细表达:
							①如果返回的是非promise的任意值, 新promise变为fulfilled, value为返回的值
							②如果抛出异常, 新promise变为rejected, reason为抛出的异常
							③如果返回的是另一个新promise, 此promise的结果就会成为新promise的结果

    catch返回的是一个新的Promise实例，它的数据、状态由什么决定?
					(1)简单表达: 由catch()所指定的失败回调函数执行的结果决定。
					(2)详细表达:
							①如果返回的是非promise的任意值, 新promise变为fulfilled, value为返回的值
							②如果抛出异常, 新promise变为rejected, reason为抛出的异常
							③如果返回的是另一个新promise, 此promise的结果就会成为新promise的结果
    */
	
	//验证then返回值的规则
	const p = new Promise((resolve,reject)=>{
		setTimeout(()=>{
			reject('hello')
		},1000)
	})
	const x = p.then(
		value => {
			console.log('p成功了',value);
			return new Promise((resolve,reject)=>{
				setTimeout(()=>{
					resolve('atguigu')
				},6000)
			})
		},
		reason => {console.log('p失败了',reason)}
	)
	x.then(
		value => {console.log('x成功了',value)},
		reason => {console.log('x失败了',reason)}
	)


	//验证catch返回值的规则
	const p = new Promise((resolve,reject)=>{
		setTimeout(()=>{
			reject('hello')
		},1000)
	})

	const x = p.catch(
		reason => {
			console.log('p失败了',reason);
			return new Promise((resolve,reject)=>{
				setTimeout(()=>{
					resolve('atguigu')
				},2000)
			})
		}
	)

	x.then(
		value => {console.log('x成功了',value)},
		reason => {console.log('x失败了',reason)}
	)
</script>
</body>
</html>